#ifndef ACCOUNT_HH
#define ACCOUNT_HH

#include <string>
#include <vector>
#include <memory>
#include <iostream>

#include <iostream>
#include <iomanip>
#include <limits>
#include "Customer.hh"
#include "Transaction.hh"
#include "ReportGenerator.hh"

using namespace std;

class Account {
protected:
    string accountID;
    double balance;
    Customer* owner;
    vector<shared_ptr<Transaction>> transactions;

public:
    Account(const string& id, Customer* owner);
    virtual ~Account() = default;

    string getID() const;
    double getBalance() const;
    Customer* getOwner() const;

    void addTransaction(shared_ptr<Transaction> t);
    const vector<shared_ptr<Transaction>>& getTransactions() const;
    void showMenu();

    virtual bool deposit(double amount, const string& note) = 0;
    virtual bool withdraw(double amount, const string& note) = 0;
    virtual bool transfer(Account* to, double amount, const string& note) = 0;
    virtual void getInfo() const = 0;
    virtual string getAccountType() const = 0;
};

#endif